單一職責原則 (Single responsibility principle) 簡稱 SRP,相信大家對它都不陌生,它時常出現在物件導向的書中,我最近一次看到它是在Clean Architecture裡,Robert C. Martin 在書中有提到,在所有 SOLID 原則中,SRP 是一個最容易被誤解的設計原則,因為它的名字會讓很多程式設計師,就假設它意味著每個模組都應該只做一件事。但其實這樣對 SRP 的描述不完全正確,在此就不劇透了,請大家自己去買書來看。
一個模組應該只對唯一的一個角色 (actor) 負責 - Robert C. Martin
我們在忠於 DRY(Don't Repeat Yourself) 原則下,經常把相同的程式邏輯抽成共用。但若兩段程式碼字面上看起來完全相同,背後的需求是不同的,若這樣偶然重複的程式碼合併在一起,反而容易造成雙方邏輯不必要的相依,最後還是要重新拆開來。俗話說:「請神容易,送神難。」所以我們在設計模組時,需要非常小心這點。如果一個模組的存在是針對一個很「特定的目的」,那就符合 SRP,我們來小小偷窺一下 webdriverio 原始碼。
https://github.com/webdriverio/webdriverio/tree/master/packages
你可以看到許多以 wdio-*-reporter
的模組,它們存在的目的都只有一個功能,就是輸出測試報表。這些模組之間的差異呢,只是針對測試結果的不同呈現方式有所不同。
wdio-allure-reporter
wdio-concise-reporter
wdio-dot-reporter
wdio-junit-reporter
wdio-smoke-test-reporter
wdio-spec-reporter
wdio-sumologic-reporter
並且作者還額外保留了 wdio-reporter
的模組化設計,讓開發者可以自訂自己格式的測試報表。
import Reporter from '@wdio/reporter'
export default MyCustomeReporter extends Reporter {
constructor () {
super()
// your custom logic if necessary
// ...
}
onRunnerStart () {
// ...
}
onSuiteStart (suite) {
// ...
}
// ...
}
像 wdio-video-reporter 就是素人開發的延伸模組,當我們能做出好的設計架構,才有機會吸引到其他開發者入坑。
題外話,最近我家附近的最後唯一一間書局倒了,忽然有感而發。